package com.cardone.platform.usercenter.dao;

import org.springframework.cache.annotation.Cacheable;

import com.cardone.common.cache.Caches;
import com.cardone.common.dto.PaginationDto;
import com.cardone.persistent.support.SimpleDao;
import com.cardone.platform.usercenter.dto.UserDto;
import com.cardone.platform.usercenter.service.UserService;

/**
 * 用户
 *
 * @author yaohaitao
 *
 */
public interface UserDao extends SimpleDao<UserDto> {
	/**
	 * sql标识
	 *
	 * @author yaohaitao
	 *
	 */
	public enum SqlIds {
		/**
		 * 删除
		 */
		deleteByIds,

		/**
		 * 查询
		 */
		findByCode,

		/**
		 * 查询
		 */
		find,

		/**
		 * 查询
		 */
		findByCodeForLogin,

		/**
		 * 查询
		 */
		findById,

		/**
		 * 查询
		 */
		findByLikeCode,

		/**
		 * 查询
		 */
		findByOrgIdAndLikeCode,

		/**
		 * 插入
		 */
		insertByCode,

		/**
		 * 插入
		 */
		insertByNotExistsCode,

		/**
		 * 读取
		 */
		readByCode,

		/**
		 * 读取
		 */
		readByLikeCode,

		/**
		 * 读取
		 */
		readByOrgIdAndLikeCode,

		/**
		 * 更新
		 */
		updateByCode,

		/**
		 * 更新
		 */
		updateEndDateByIdForInvalid;

		/**
		 * 根目录
		 */
		private static final String ROOT = "/platform/usercenter/user/";

		/**
		 * 标识
		 */
		private final String id;

		/**
		 * sql标识
		 */
		private SqlIds() {
			this.id = SqlIds.ROOT + this.name();
		}

		/**
		 * 获取
		 *
		 * @return sql标识
		 */
		public String id() {
			return this.id;
		}
	}

	/**
	 * 分页
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param paginationUser
	 *          用户对象
	 *
	 * @return 用户分页对象
	 */
	<P> PaginationDto<P> paginationByOrgIdAndLikeCode(final Class<P> mappedClass, final UserDto paginationUser);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param id
	 *          标识
	 * @return 返回对象
	 */
	@Cacheable(value = UserService.BEAN_ID, key = Caches.KEY_1)
	UserDto findById(final String id);

	/**
	 * 更新
	 *
	 * @param updateUser
	 *          用户对象
	 * @return 影响行数
	 */
	int updateForDetail(final UserDto updateUser);

	/**
	 * 更新
	 *
	 * @param id
	 *          标识
	 * @return 影响行数
	 */
	int updateEndDateByIdForInvalid(final String id);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findUser
	 *          用户对象
	 *
	 * @return 返回对象
	 */
	<P> P findByCodeForLogin(final Class<P> mappedClass, final UserDto findUser);

	/**
	 * 更新手机号码
	 *
	 * @param id
	 *          标识
	 * @param mobilePhone
	 *          手机号码
	 * @return 影响行数
	 */
	int updateMobilePhone(final String id, final String mobilePhone);

	/**
	 * 更新
	 *
	 * @param updateUser
	 *          用户对象
	 * @param updateMobilePhone
	 *          更新手机号码
	 *
	 * @return 影响行数
	 */
	int updateForBaseInfo(final UserDto updateUser, final Boolean updateMobilePhone);

	/**
	 * 更新
	 *
	 * @param id
	 *          用户标识
	 * @param oldPassword
	 *          旧密码
	 * @param updatePassword
	 *          更新密码
	 * @return 影响行数
	 */
	int updatePasswordById(final String id, final String oldPassword, final String updatePassword);

	/**
	 * 更新
	 *
	 * @param updateUser
	 *          用户对象
	 * @param updateMobilePhone
	 *          更新手机号码
	 *
	 * @return 影响行数
	 */
	int updateForFullInfo(final UserDto updateUser, final Boolean updateMobilePhone);
}